# uamcf/utils/logger.py
import os
import logging
from logging.handlers import RotatingFileHandler
from typing import Optional, Dict, Any

# 全局日志配置
_LOG_CONFIG = {
    "level": logging.INFO,
    "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    "date_format": "%Y-%m-%d %H:%M:%S",
    "log_dir": "logs",
    "max_size": 10 * 1024 * 1024,  # 10MB
    "backup_count": 5
}

# 日志缓存，避免重复创建
_LOGGERS = {}


def setup_logger(config: Optional[Dict[str, Any]] = None) -> None:
    """
    设置全局日志配置

    Args:
        config: 日志配置，可包含以下键:
            - level: 日志级别 (默认: logging.INFO)
            - format: 日志格式 (默认: "%(asctime)s - %(name)s - %(levelname)s - %(message)s")
            - date_format: 日期格式 (默认: "%Y-%m-%d %H:%M:%S")
            - log_dir: 日志目录 (默认: "logs")
            - max_size: 单个日志文件最大大小，字节 (默认: 10MB)
            - backup_count: 保留的日志文件数量 (默认: 5)
    """
    global _LOG_CONFIG

    if config:
        # 更新配置
        for key, value in config.items():
            if key in _LOG_CONFIG:
                _LOG_CONFIG[key] = value

    # 确保日志目录存在
    if not os.path.exists(_LOG_CONFIG["log_dir"]):
        os.makedirs(_LOG_CONFIG["log_dir"])

    # 配置根日志器
    root_logger = logging.getLogger()
    root_logger.setLevel(_LOG_CONFIG["level"])

    # 清除现有处理器
    for handler in root_logger.handlers[:]:
        root_logger.removeHandler(handler)

    # 添加控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(_LOG_CONFIG["level"])
    console_formatter = logging.Formatter(
        _LOG_CONFIG["format"],
        datefmt=_LOG_CONFIG["date_format"]
    )
    console_handler.setFormatter(console_formatter)
    root_logger.addHandler(console_handler)

    # 添加文件处理器
    log_file = os.path.join(_LOG_CONFIG["log_dir"], "uamcf.log")
    file_handler = RotatingFileHandler(
        log_file,
        maxBytes=_LOG_CONFIG["max_size"],
        backupCount=_LOG_CONFIG["backup_count"]
    )
    file_handler.setLevel(_LOG_CONFIG["level"])
    file_formatter = logging.Formatter(
        _LOG_CONFIG["format"],
        datefmt=_LOG_CONFIG["date_format"]
    )
    file_handler.setFormatter(file_formatter)
    root_logger.addHandler(file_handler)


def get_logger(name: str) -> logging.Logger:
    """
    获取指定名称的日志器

    Args:
        name: 日志器名称

    Returns:
        配置好的日志器
    """
    global _LOGGERS

    # 检查缓存
    if name in _LOGGERS:
        return _LOGGERS[name]

    # 确保全局配置已应用
    if not logging.getLogger().handlers:
        setup_logger()

    # 创建命名日志器
    logger = logging.getLogger(name)
    logger.setLevel(_LOG_CONFIG["level"])

    # 缓存并返回
    _LOGGERS[name] = logger
    return logger